package li.com.springaidemo.timing;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;

/**
 * @author @author Created by zhuzqc on 2023/1/30 15:39
 * 任务线程池管理工具
 */
@Slf4j
public class SchedulerUtil {
    /**
     * 线程调度工具对象，作为该类的成员变量
     * ThreadPoolTaskScheduler类是 Spring 框架中用于在应用程序中执行异步任务和定时任务的线程池任务调度器
     */
    private static ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

    /**
     *初始化 map 对象，装配 schedule 方法的返回对象为 value 值
     * ScheduledFuture类的作用是进行任务调度，用于管理定时任务
     */
    private static Map<Integer, ScheduledFuture<?>> scheduledFutureMap = new HashMap<Integer, ScheduledFuture<?>>();

    static {
        threadPoolTaskScheduler.initialize();
    }

    /**
     * 将Runnable对象和Trigger对象作为参数传入该静态方法
     * @param runnable
     * @param trigger
     * @param 定时任务id
     */
    public static void put(Runnable runnable, Trigger trigger, Integer id) {
//        利用 schedule 方法结合 Trigger 触发器，可以实现在指定的时间点执行一次任务，或者按照特定的时间表达式（如 Cron 表达式）来执行任务。
        ScheduledFuture<?> scheduledFuture = threadPoolTaskScheduler.schedule(runnable, trigger);
        // 将携带有Runnable和Trigger的ScheduledFuture类对象作为 Map 的 value 进行装配
        // 放入 Map 中作为 value
        scheduledFutureMap.put(id, scheduledFuture);
        log.info("---添加定时任务--->" + id);
    }

    /**
     * 通过上述 put 方法的参数id（定时任务id）标识，将定时任务移除出 map
     * @param id
     */
    public static void delete(List<Integer> ids) {
        for(Integer id:ids){
            ScheduledFuture<?> scheduledFuture = scheduledFutureMap.get(id);
            // 条件判断
            if (scheduledFuture != null && scheduledFuture.isCancelled()) {
//            将任务停止
                scheduledFuture.cancel(true);
            }
            scheduledFutureMap.remove(id);
            log.info("---取消定时任务--->" + id);
        }
    }
}

